#!/usr/bin/perl

die("No HOME set, cannot install defaults.\n")
    if !$ENV{'HOME'};

die("No KODI_HOME set, cannot install defaults.\n")
    if !$ENV{'KODI_HOME'};

sub get_home {
    return $ENV{'HOME'} if defined $ENV{'HOME'};
}

sub get_extras {
    # KODI_HOME is assumed to be always setup
    return $ENV{'KODI_HOME'}."/extras/" if get_os() eq "osx";
    return;
}

sub get_xbmc_home {
    my $os = get_os();
    my $home = get_home();
    return if !defined $home;
    if ( $os eq "osx" ) {
        return $home."/Library/Application Support/XBMC";
    }
    elsif ( $os eq "linux" ) {
        return $home."/.xbmc";
    }
    return;
}

sub get_app_home {
    my $os = get_os();
    my $home = get_home();
    return if !defined $home;
    if ( $os eq "osx" ) {
        return $home."/Library/Application Support/Kodi";
    }
    elsif ( $os eq "linux" ) {
        return $home."/.kodi";
    }
    return;
}

sub get_os {
    if ( defined $ENV{'OSTYPE'} && $ENV{'OSTYPE'} =~ /linux/ ) {
        return "linux";
    }
    return "osx";
}

sub get_userdata_path {
    my $apphome = get_app_home();
    return if !defined $apphome;
    return "$apphome/userdata";
}

sub setup_sources {
    my $apphome = get_app_home();
    my $userdata = get_userdata_path();
    my $sources = $userdata."/sources.xml";

    # check whether a sources.xml already exists, and if it does back it up
    if ( -f $sources ) {
        print STDERR "sources.xml found at \"$sources\", backing up\n";
        my $backup_sources = $sources.".".time().".xml";
        `cp -f \"$sources\" \"$backup_sources\"`;
    }

    # construct a sources.xml string
    my $sources_xml = get_sources_xml( get_default_sources() );
    if ( $sources_xml ) {
        open SOURCES, ">$sources" || exit;
        print SOURCES get_sources_xml( get_default_sources() );
        close SOURCES;
    }
}

sub get_sources_xml {
    my $sources = shift;
    my ($sourcetype, $source);

    return if !defined $sources;

    my $xml = "<sources>\n";
    while ( ($sourcetype, $source) = each ( %$sources ) ) {
        $xml .= (" " x 4)."<$sourcetype>\n";
        $xml .= (" " x 8)."<default></default>\n";
        my ($name, $path);
        while ( ($name, $path) = each( %{ $source } ) ) {
            $xml .= (" " x 8)."<source>\n";
            $xml .= (" " x 12)."<name>$name</name>\n";

            if ( $path =~ /(.*)\^\^(.*)/ ) {
              $xml .= (" " x 12)."<path>".$1."</path>\n";
              $xml .= (" " x 12)."<thumbnail>".$2."</thumbnail>\n";
            }
            else {
              $xml .= (" " x 12)."<path>".$path."</path>\n";
            }

            if ($path ne "/" ) {
              $xml .= (" " x 12)."<allowsharing>true</allowsharing>\n";
            }

            $xml .= (" " x 8)."</source>\n";
        }
        $xml .= (" " x 4)."</$sourcetype>\n";
    }
    $xml .= "</sources>\n";
    return $xml;
}

sub get_default_sources {
    my $sources = {};
    my $home = get_home();
    my $apphome = get_app_home();
    return if !defined $apphome;

    $sources->{'programs'} = {};
    $sources->{'video'} = {};
    $sources->{'music'} = {};
    $sources->{'pictures'} = {};
    $sources->{'files'} = {};

    if ( get_os() eq "osx" ) {

        # Default sources for OS X
        $sources->{'music'}->{'Music'} = $home."/Music";
        $sources->{'music'}->{'Music Playlists'} = "special://musicplaylists";
        $sources->{'video'}->{'Movies'} = $home."/Movies";
        $sources->{'video'}->{'Video Playlists'} = "special://videoplaylists";
        $sources->{'pictures'}->{'Pictures'} = $home."/Pictures";
    }
    elsif ( get_os() eq "linux" ) {

        # Default source for Linux
        for my $key ( keys %$sources ) {
            $sources->{$key}->{'Media'} = "/media";
            $sources->{$key}->{'Home'} = "$home";
            $sources->{$key}->{'Desktop'} = "$home/Desktop";
            $sources->{$key}->{'Root'} = "/";
        }
    }
    return $sources;
}

sub first_app_run() {
    my $home =  get_app_home();
    if ( ! -f "$home/.setup_complete" ) {
        return 1;
    }
    return;
}

sub first_app_version_run() {
    my $home =  get_app_home();
    if ( ! -f "$home/.setup_complete" ) {
        return 1;
    }
    return;
}

sub needs_kodi_migration() {
    my $xbmchome = get_xbmc_home();
    my $apphome = get_app_home();
    #check if there is an old XBMC folder to migrate
    if ( -d "$xbmchome" && ! -d "$apphome" ) {
        return 1;
    }
    return;
}

sub setup_default_app() {
    my $extras = get_extras();
    my $apphome = get_app_home();
    my $userdata = get_userdata_path();

    die("No extras :(\n")
        if !defined $extras;
    die("No XBMC home folder :(\n")
        if !defined $apphome;
    die ("No userdata folder :(\n")
        if !defined $userdata;

    # create userdata directory if it doesn't exist
    `mkdir -p "$userdata"`;
    # copy extra stuff to xbmc's userdata directory
    `cp -fRv "$extras/user/" "$userdata"`;

    setup_sources();
    `touch -f "$apphome/.setup_complete"`;
}

sub setup_version_app() {
    #TODO
}

#migration from XBMC to Kodi
sub migrate_to_kodi() {
    my $xbmchome = get_xbmc_home();
    my $apphome = get_app_home();
    print "mv $xbmchome $apphome";
   `mv "$xbmchome" "$apphome"`;
   `touch -f "$apphome/.kodi_data_was_migrated"`;
}

if (needs_kodi_migration()) {
    migrate_to_kodi();
}

if (first_app_run()) {
    setup_default_app();
}

if (first_app_version_run()) {
    setup_version_app();
}
